<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>表的基本概念</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="SECT1">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="ddl.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="ddl.html">快退</a></td><td width="60%" align="center" valign="bottom">章5. 数据定义</td><td width="10%" align="right" valign="top"><a href="ddl.html">快进</a></td><td width="10%" align="right" valign="top"><a href="ddl-default.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<div class="SECT1"><h1 class="SECT1"><a name="DDL-BASICS">5.1. 表的基本概念</a></h1><a name="AEN1917"></a><a name="AEN1919"></a><a name="AEN1921"></a>
<p>关系型数据库中的表非常类似纸面上的一张表：它由行和列组成。字段的数目是固定的，每个字段都有一个名字。行的数目是变化的(它反映了任意时刻存储的数据量)。SQL 对行的顺序没有任何承诺(除非你明确地要求排序)。这些内容在<a href="queries.html">章7</a>里介绍。另外，SQL 并不给行赋予唯一的标识，因此我们很可能在一个表中有好几个完全相同的行。这是作为 SQL 基础的下层数学模型的必然结果，但是这通常是我们不愿意看到的。本章稍后的部分将讨论如何处理这个问题。</p>
<p>每个字段都有一个数据类型。数据类型控制着一个字段所有可能值的集合，并且控制着字段中数据的语义，这样它就可以用于计算。比如，一个声明为数值类型的字段不会接受任意文本字符串，而存储在这种字段里的数据可以用于数学计算。相比之下，一个声明为字符串类型的字段接受几乎任意类型的数据，但是它们不能进行数学计算(不过可以进行像字符串连接之类的操作)。</p>
<p>PostgreSQL 包含一套可剪裁的内置数据类型，这些类型可以适用于许多应用。用户也可以定义它们自己的数据类型。大多数内置的数据类型有显而易见的名字和语义，因此我们把详细的解释放在了<a href="datatype.html">章8</a>。常用的数据类型有：用于整数的 <tt class="TYPE">integer</tt> 、用于可能为分数的<tt class="TYPE">numeric</tt> 、用于字符串的 <tt class="TYPE">text</tt> 、用于日期的 <tt class="TYPE">date</tt> 、用于时间的 <tt class="TYPE">time</tt> 、用于时间戳的 <tt class="TYPE">timestamp</tt> 。</p>
<a name="AEN1935"></a>
<p>要创建一个表，可用使用 <a href="sql-createtable.html"><i>CREATE TABLE</i></a> 命令。在这个命令里，你至少要为新表声明一个名字，还有各字段的名字以及其数据类型。比如：</p>
<pre class="PROGRAMLISTING">CREATE TABLE my_first_table (
    first_column text,
    second_column integer
);</pre>
<p>这样就创建了一个有两个字段的名为 <tt class="LITERAL">my_first_table</tt> 的表。第一个字段的名字是 <tt class="LITERAL">first_column</tt>  ，数据类型为 <tt class="TYPE">text</tt> ；第二个字段的名字是 <tt class="LITERAL">second_column</tt> ，数据类型是 <tt class="TYPE">integer</tt> 。表和字段的名字遵循<a href="sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS">节4.1.1</a>里面解释的标识符语法。类型名通常也是标识符(但是有一些例外)。请注意字段列表是逗号分隔的，并且用圆括弧包围。</p>
<p>当然，前面只是一个非常虚构的例子。通常，你会给表和字段取一个有意义的名字，所以还是让我们给一个比较现实的例子：</p>
<pre class="PROGRAMLISTING">CREATE TABLE products (
    product_no integer,
    name text,
    price numeric
);</pre>
<p><tt class="TYPE">numeric</tt> 类型可以存储分数部分，金额很可能有这样的分数部分。</p>
<div class="TIP">
<blockquote class="TIP">
<p><b>【提示】</b>如果你创建了许多相互关联的表，那么最好为表和字段选择一致的命名模式。比如，表名字可以统一选择单数或者复数，两种选择都有这样那样的理论家支持。</p>
</blockquote>
</div>
<p>一个表能包含的字段数目是有限制的。根据字段类型的不同，这个数目可能在 250 到 1600 之间。不过，不管是哪一端的数字，如果你设计的表包含那么多的字段好像都很不可能发生，否则是设计上有问题的表现。</p>
<a name="AEN1953"></a>
<p>如果你不再需要一个表，那么可以用 <a href="sql-droptable.html"><i>DROP TABLE</i></a> 命令删除它。像这样：</p>
<pre class="PROGRAMLISTING">DROP TABLE my_first_table;
DROP TABLE products;</pre>
<p>试图删除一个不存在的表是一个错误。不过，在 SQL 脚本文件里，我们通常在创建表之前无条件删除它并忽略错误信息。当然你还可以使用 <tt class="LITERAL">DROP TABLE IF EXISTS</tt> 来避免警告信息，不过这并不符合 SQL 标准。</p>
<p>如果你需要修改一个已经存在的表，那么可以看看本章稍后的<a href="ddl-alter.html">节5.5</a>。</p>
<p>使用到目前为止讨论的工具我们可以创建功能完整的表。本章剩下的部分是有关向表定义中增加特性、保证数据完整性、安全性或便利性的内容。如果你急于给表填充数据，那么你可以忽略余下的部分直接到<a href="dml.html">章6</a>，然后在稍后的时候再回来阅读本章。</p>
</div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="ddl.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="ddl-default.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">数据定义</td><td width="34%" align="center" valign="top"><a href="ddl.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">缺省值</td></tr>
</table>
</div>
</body></html>